package cn.ahaoweb.drule.core;

import cn.ahaoweb.drule.core.handler.PostExecuteHandler;
import cn.ahaoweb.drule.core.handler.PreExecuteHandler;
import cn.ahaoweb.drule.core.handler.RuleExecuteExceptionHandler;
import cn.ahaoweb.drule.core.listener.RuleExecuteListener;
import org.kie.api.event.rule.AgendaEventListener;

import java.util.List;
import java.util.Map;

/**
 * @Name: 规则服务会话管理器
 * @Description:
 * @Author: wangzhonghao
 * @Date: 2025/2/13 15:23
 */
public interface RuleSession {

    /**
     * 获取所属的规则服务。
     *
     * @return
     */
    RuleService getRuleService();

    /**
     * 初始化方法，在实例化后调用
     */
    public void init();

    /**
     * 执行规则
     * @param factInfo 执行过程产生的事实信息
     * @return
     */
    void execute(FactInfo factInfo);

    /**
     * 执行规则
     * @param in 入参对象
     * @param out 出参对象
     * @return
     */
    default FactInfo execute(Object in, Object out){
        FactInfo build = FactInfo.FactInfoBuilder
                .builder()
                .byInput(in)
                .byOutput(out)
                .build();
        execute(build);
        return build;
    }

    /**
     * 异常处理
     * @param e
     */
    void handlerException(RuntimeException e, FactInfo factInfo);

    /**
     * 添加全局变量
     * @param identify
     * @param value
     * @return
     */
    RuleSession addGlobal(String identify, Object value);

    /**
     * 获取所有的全局变量
     * @return
     */
    Map<String, Object> getGlobals();

    /**
     * 获取执行监听器
     * @return
     */
    List<AgendaEventListener> getListeners();

    /**
     * 添加执行监听器
     * @param ruleExecuteListener
     * @return
     */
    RuleSession addListener(RuleExecuteListener ruleExecuteListener);

    /**
     * 添加执行监听器
     * @param agendaEventListener drools内置
     * @return
     */
    RuleSession addAgendaEventListener(AgendaEventListener agendaEventListener);

    /**
     * 添加前置处理器
     * @param preExecuteHandler
     * @return
     */
    RuleSession addPreExecuteHandler(PreExecuteHandler preExecuteHandler);

    /**
     * 获取前置处理器
     * @return
     */
    List<PreExecuteHandler> getPreExecuteHandlers();

    /**
     * 添加后置处理器
     * @param postExecuteHandler
     * @return
     */
    RuleSession addPostExecuteHandler(PostExecuteHandler postExecuteHandler);

    /**
     * 获取后置处理器
     * @return
     */
    List<PostExecuteHandler> getPostExecuteHandlers();

    /**
     * 设置执行异常处理器
     * @param executeExceptionHandler 执行异常处理器
     */
    RuleSession executeExceptionHandler(RuleExecuteExceptionHandler executeExceptionHandler);

}
